package user;

import book.BookList;
import ioperations.IOperation;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 姚东名
 * Date: 2024-06-22
 * Time: 9:54
 */
public abstract class User {
    //用户通过接口数组和名字来操作图书系统的
    protected String name;
    IOperation[] iOperations;

    public User(String name) {
        this.name = name;
    }

    public abstract int menu();

    public void doIoperation(int choice, BookList bookList) {
        iOperations[choice].work(bookList);//真正操作图书系统
    }
}
/*
`User`是一个抽象类，它代表了一个使用图书系统的用户。以下是`User`类逻辑关系的简短分析：

1. **属性**：
   - `name`：存储用户的名字。
   - `iOperations`：是一个`IOperation`接口类型的数组，用于存储用户可以执行的各种操作。

2. **构造方法**：
   - 构造方法接受一个字符串参数，用于设置用户的名字。

3. **抽象方法**：
   - `menu()`：这是一个抽象方法，需要在`User`的子类中实现。这个方法预计会返回一个整数，可能代表用户选择的操作编号。

4. **普通方法**：
   - `doIoperation(int choice, BookList bookList)`：这个方法接受一个操作编号（`choice`）和一个`BookList`对象。根据操作编号，它会调用`iOperations`数组中相应位置的`IOperation`对象的`work`方法，对`bookList`执行具体的操作。这是用户与图书系统交互的桥梁，通过这个方法，用户可以执行添加、查找、归还或展示书籍等操作。

简而言之，`User`类定义了一个使用图书系统的用户的基本属性和行为。它使用了一个`IOperation`接口数组来代表用户可以执行的各种操作，并通过`doIoperation`方法来实际执行用户选择的操作。这个类是一个抽象类，意味着它不能直接实例化，而是需要具体的子类来实现`menu`方法，并可能提供额外的功能或属性。
 */


/*
父类`User`定义了用户的通用属性和行为，包括用户名字和一系列操作。它设置了一个框架，使得不同的用户类型可以执行不同的操作。

子类`AdminUser`和`NormalUser`分别继承了`User`类，代表两种不同类型的用户：管理员和普通用户。这两个子类都拥有父类的属性和方法，但各自定制了可执行的操作集合`iOperations`和菜单选项`menu()`。

`AdminUser`提供了管理员特有的功能，如添加、删除图书等，而`NormalUser`则提供了普通用户需要的功能，如借阅和归还图书。

通过这种继承关系，代码实现了用户角色的多态性，即不同类型的用户可以以不同的方式使用系统，但都基于相同的用户基础结构。
 */

/*
这个图书系统的逻辑关系可以总结如下：

1. **基础结构**：系统的基础是`User`类，它定义了用户的通用属性和行为，包括用户名和一系列操作。这个类为不同类型的用户提供了一个统一的框架。

2. **用户角色**：系统通过继承`User`类来定义两种不同类型的用户角色——`AdminUser`（管理员用户）和`NormalUser`（普通用户）。这两种用户角色都继承了父类的基本属性和方法，但根据各自的需求定制了特定的功能和操作。

3. **操作集合**：每个用户角色都有一个操作集合（`iOperations`数组），其中包含了该角色可以执行的操作。这些操作通常封装在实现了某个接口（如`IOperation`）的对象中，允许系统以统一的方式调用不同的操作。

4. **菜单系统**：每个用户角色都有一个定制的菜单系统（通过`menu()`方法实现），用于向用户展示可用的操作选项，并接收用户的选择。这个菜单系统根据用户的角色（管理员或普通用户）提供不同的选项。

5. **操作执行**：当用户通过菜单选择一个操作后，系统会根据用户的选择调用相应的操作（通过`doIoperation()`方法）。这个调用是基于操作集合中的接口对象，实现了多态性，使得系统可以灵活地处理不同类型的操作。

6. **扩展性**：通过接口和继承的使用，系统具有良好的扩展性。如果需要添加新的用户角色或操作，只需创建新的类或实现新的接口，而无需对现有代码进行大量修改。

综上所述，这个图书系统通过面向对象的设计原则（如继承、多态和接口）构建了一个灵活且可扩展的逻辑结构，能够支持不同类型的用户执行各自特定的操作。
 */

/*
该图书系统可以从以下几个方面进行改善：

1. **增加用户认证与权限管理**：目前系统虽然通过不同的用户类（AdminUser和NormalUser）区分了用户角色，但可以进一步增加用户认证机制，如用户名和密码登录，以及更细粒度的权限管理，确保用户只能访问其权限范围内的功能。

2. **引入数据库支持**：为了提升系统的数据持久化和检索能力，可以集成数据库来存储图书信息、用户信息和借阅记录等。这将使得数据管理更加高效和可靠。

3. **优化用户界面**：当前的菜单系统是基于控制台的简单文本输出，可以考虑开发一个图形用户界面（GUI）或网页界面，提升用户体验和交互性。

4. **增加图书推荐功能**：通过分析用户的借阅历史和偏好，可以为用户提供个性化的图书推荐，增强用户粘性和满意度。

5. **实现图书预约与续借功能**：为了满足用户更多的需求，可以增加图书预约和续借功能，使得用户能够更加方便地管理自己的借阅行为。

6. **集成在线支付系统**：如果图书系统涉及费用（如逾期罚款、图书购买等），可以集成在线支付系统，为用户提供便捷的支付方式。

7. **提供API接口**：为了与其他系统进行集成，可以提供API接口，允许第三方开发者或系统调用图书系统的功能，如查询图书信息、进行借阅操作等。

总结：通过增加用户认证与权限管理、引入数据库支持、优化用户界面、增加图书推荐功能、实现图书预约与续借功能、集成在线支付系统以及提供API接口等改进措施，可以进一步提升图书系统的安全性、可用性、用户体验和扩展性。这些改善将有助于图书系统更好地服务于用户，满足用户多样化的需求。
 */

/*
技术博客文章摘要

本文深入探讨了一个灵活且可扩展的图书系统的设计与实现。该系统基于面向对象的设计原则，通过继承、多态和接口等关键技术，构建了一个能够支持不同类型用户执行特定操作的逻辑框架。我们详细介绍了User类作为基础结构的重要性，并通过AdminUser和NormalUser两个子类展示了如何定制不同用户角色的功能和操作。此外，我们还剖析了操作集合与菜单系统的设计理念，以及如何通过接口实现操作的多态调用。该系统不仅满足了图书管理的基本需求，更在扩展性与灵活性方面表现出色，为未来功能的增加和修改提供了便捷的途径。通过本文，读者将深刻理解面向对象设计在图书系统中的应用及其优势。
 */

